From a2684bbb14621a0adae431cf33c6ed32965a59b4 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Thu, 14 Dec 2006 10:49:54 +0000 Subject: [PATCH] [XEN] Spot incorrect use of lXe_write & Co. Signed-off-by: Jan Beulich --- xen/include/asm-x86/page.h | 36 ++++++++++++++++-------- xen/include/asm-x86/x86_32/page-2level.h | 6 ++-- xen/include/asm-x86/x86_32/page-3level.h | 29 ++++++++++--------- xen/include/asm-x86/x86_64/page.h | 6 ++-- 4 files changed, 45 insertions(+), 32 deletions(-) diff --git a/xen/include/asm-x86/page.h b/xen/include/asm-x86/page.h index d384d34d65..e2bbc6c03f 100644 --- a/xen/include/asm-x86/page.h +++ b/xen/include/asm-x86/page.h @@ -26,25 +26,37 @@ #endif /* Read a pte atomically from memory. */ -#define l1e_read_atomic(l1ep) l1e_from_intpte(pte_read_atomic(l1ep)) -#define l2e_read_atomic(l2ep) l2e_from_intpte(pte_read_atomic(l2ep)) -#define l3e_read_atomic(l3ep) l3e_from_intpte(pte_read_atomic(l3ep)) -#define l4e_read_atomic(l4ep) l4e_from_intpte(pte_read_atomic(l4ep)) +#define l1e_read_atomic(l1ep) \ + l1e_from_intpte(pte_read_atomic(&l1e_get_intpte(*(l1ep)))) +#define l2e_read_atomic(l2ep) \ + l2e_from_intpte(pte_read_atomic(&l2e_get_intpte(*(l2ep)))) +#define l3e_read_atomic(l3ep) \ + l3e_from_intpte(pte_read_atomic(&l3e_get_intpte(*(l3ep)))) +#define l4e_read_atomic(l4ep) \ + l4e_from_intpte(pte_read_atomic(&l4e_get_intpte(*(l4ep)))) /* Write a pte atomically to memory. */ -#define l1e_write_atomic(l1ep, l1e) pte_write_atomic(l1ep, l1e_get_intpte(l1e)) -#define l2e_write_atomic(l2ep, l2e) pte_write_atomic(l2ep, l2e_get_intpte(l2e)) -#define l3e_write_atomic(l3ep, l3e) pte_write_atomic(l3ep, l3e_get_intpte(l3e)) -#define l4e_write_atomic(l4ep, l4e) pte_write_atomic(l4ep, l4e_get_intpte(l4e)) +#define l1e_write_atomic(l1ep, l1e) \ + pte_write_atomic(&l1e_get_intpte(*(l1ep)), l1e_get_intpte(l1e)) +#define l2e_write_atomic(l2ep, l2e) \ + pte_write_atomic(&l2e_get_intpte(*(l2ep)), l2e_get_intpte(l2e)) +#define l3e_write_atomic(l3ep, l3e) \ + pte_write_atomic(&l3e_get_intpte(*(l3ep)), l3e_get_intpte(l3e)) +#define l4e_write_atomic(l4ep, l4e) \ + pte_write_atomic(&l4e_get_intpte(*(l4ep)), l4e_get_intpte(l4e)) /* * Write a pte safely but non-atomically to memory. * The PTE may become temporarily not-present during the update. */ -#define l1e_write(l1ep, l1e) pte_write(l1ep, l1e_get_intpte(l1e)) -#define l2e_write(l2ep, l2e) pte_write(l2ep, l2e_get_intpte(l2e)) -#define l3e_write(l3ep, l3e) pte_write(l3ep, l3e_get_intpte(l3e)) -#define l4e_write(l4ep, l4e) pte_write(l4ep, l4e_get_intpte(l4e)) +#define l1e_write(l1ep, l1e) \ + pte_write(&l1e_get_intpte(*(l1ep)), l1e_get_intpte(l1e)) +#define l2e_write(l2ep, l2e) \ + pte_write(&l2e_get_intpte(*(l2ep)), l2e_get_intpte(l2e)) +#define l3e_write(l3ep, l3e) \ + pte_write(&l3e_get_intpte(*(l3ep)), l3e_get_intpte(l3e)) +#define l4e_write(l4ep, l4e) \ + pte_write(&l4e_get_intpte(*(l4ep)), l4e_get_intpte(l4e)) /* Get direct integer representation of a pte's contents (intpte_t). */ #define l1e_get_intpte(x) ((x).l1) diff --git a/xen/include/asm-x86/x86_32/page-2level.h b/xen/include/asm-x86/x86_32/page-2level.h index 86e8dbe30f..14a1d6411f 100644 --- a/xen/include/asm-x86/x86_32/page-2level.h +++ b/xen/include/asm-x86/x86_32/page-2level.h @@ -28,9 +28,9 @@ typedef l2_pgentry_t root_pgentry_t; #endif /* !__ASSEMBLY__ */ -#define pte_read_atomic(ptep) (*(intpte_t *)(ptep)) -#define pte_write_atomic(ptep, pte) ((*(intpte_t *)(ptep)) = (pte)) -#define pte_write(ptep, pte) ((*(intpte_t *)(ptep)) = (pte)) +#define pte_read_atomic(ptep) (*(ptep)) +#define pte_write_atomic(ptep, pte) (*(ptep) = (pte)) +#define pte_write(ptep, pte) (*(ptep) = (pte)) /* root table */ #define root_get_pfn l2e_get_pfn diff --git a/xen/include/asm-x86/x86_32/page-3level.h b/xen/include/asm-x86/x86_32/page-3level.h index 41bc5b0cff..6837933675 100644 --- a/xen/include/asm-x86/x86_32/page-3level.h +++ b/xen/include/asm-x86/x86_32/page-3level.h @@ -38,22 +38,23 @@ typedef l3_pgentry_t root_pgentry_t; #endif /* !__ASSEMBLY__ */ -#define pte_read_atomic(ptep) ({ \ - intpte_t __pte = *(intpte_t *)(ptep), __npte; \ - while ( (__npte = cmpxchg((intpte_t *)(ptep), __pte, __pte)) != __pte ) \ - __pte = __npte; \ +#define pte_read_atomic(ptep) ({ \ + intpte_t __pte = *(ptep), __npte; \ + while ( (__npte = cmpxchg(ptep, __pte, __pte)) != __pte ) \ + __pte = __npte; \ __pte; }) -#define pte_write_atomic(ptep, pte) do { \ - intpte_t __pte = *(intpte_t *)(ptep), __npte; \ - while ( (__npte = cmpxchg((intpte_t *)(ptep), __pte, (pte))) != __pte ) \ - __pte = __npte; \ +#define pte_write_atomic(ptep, pte) do { \ + intpte_t __pte = *(ptep), __npte; \ + while ( (__npte = cmpxchg(ptep, __pte, (pte))) != __pte ) \ + __pte = __npte; \ } while ( 0 ) -#define pte_write(ptep, pte) do { \ - *((u32 *)(ptep)+0) = 0; \ - wmb(); \ - *((u32 *)(ptep)+1) = (pte) >> 32; \ - wmb(); \ - *((u32 *)(ptep)+0) = (pte) >> 0; \ +#define pte_write(ptep, pte) do { \ + u32 *__ptep_words = (u32 *)(ptep); \ + __ptep_words[0] = 0; \ + wmb(); \ + __ptep_words[1] = (pte) >> 32; \ + wmb(); \ + __ptep_words[0] = (pte) >> 0; \ } while ( 0 ) /* root table */ diff --git a/xen/include/asm-x86/x86_64/page.h b/xen/include/asm-x86/x86_64/page.h index fca1173c1e..e6dcb1c025 100644 --- a/xen/include/asm-x86/x86_64/page.h +++ b/xen/include/asm-x86/x86_64/page.h @@ -43,9 +43,9 @@ typedef l4_pgentry_t root_pgentry_t; #endif /* !__ASSEMBLY__ */ -#define pte_read_atomic(ptep) (*(intpte_t *)(ptep)) -#define pte_write_atomic(ptep, pte) ((*(intpte_t *)(ptep)) = (pte)) -#define pte_write(ptep, pte) ((*(intpte_t *)(ptep)) = (pte)) +#define pte_read_atomic(ptep) (*(ptep)) +#define pte_write_atomic(ptep, pte) (*(ptep) = (pte)) +#define pte_write(ptep, pte) (*(ptep) = (pte)) /* Given a virtual address, get an entry offset into a linear page table. */ #define l1_linear_offset(_a) (((_a) & VADDR_MASK) >> L1_PAGETABLE_SHIFT) -- 2.30.2